home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / var / lib / python-support / python2.6 / glchess / chess / bitboard.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  4.6 KB  |  214 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4.  
  5. def getIndex(square):
  6.     file = ord(square[0]) - ord('a')
  7.     rank = ord(square[1]) - ord('1')
  8.     return (7 - rank) * 8 + file
  9.  
  10.  
  11. def getRankAndFile(index):
  12.     file = index % 8
  13.     rank = 7 - index / 8
  14.     return (file, rank)
  15.  
  16.  
  17. def reflectField(field):
  18.     outField = 0
  19.     for i in xrange(64):
  20.         if field & LOCATIONS[i]:
  21.             (file, rank) = getRankAndFile(i)
  22.             outField |= LOCATIONS[rank * 8 + file]
  23.             continue
  24.     
  25.     return outField
  26.  
  27.  
  28. def reflectMoves(inMoves, outMoves):
  29.     for i in xrange(64):
  30.         (file, rank) = getRankAndFile(i)
  31.         outMoves[rank * 8 + file] = reflectField(inMoves[i])
  32.     
  33.  
  34.  
  35. def printField(field):
  36.     string = '+---+---+---+---+---+---+---+---+\n'
  37.     rowCount = 0
  38.     colour = ' '
  39.     for l in LOCATIONS:
  40.         if field & l:
  41.             string += '|[%s]' % colour
  42.         else:
  43.             string += '| %s ' % colour
  44.         rowCount += 1
  45.         if rowCount == 8:
  46.             rowCount = 0
  47.             string += '|\n+---+---+---+---+---+---+---+---+\n'
  48.             continue
  49.         if colour == ' ':
  50.             colour = '.'
  51.             continue
  52.         colour = ' '
  53.     
  54.     print string
  55.  
  56. LOCATIONS = [
  57.     1,
  58.     2,
  59.     4,
  60.     8,
  61.     16,
  62.     32,
  63.     64,
  64.     128,
  65.     256,
  66.     512,
  67.     1024,
  68.     2048,
  69.     4096,
  70.     8192,
  71.     16384,
  72.     32768,
  73.     65536,
  74.     131072,
  75.     262144,
  76.     524288,
  77.     1048576,
  78.     2097152,
  79.     4194304,
  80.     8388608,
  81.     16777216,
  82.     33554432,
  83.     67108864,
  84.     134217728,
  85.     268435456,
  86.     536870912,
  87.     1073741824,
  88.     0x80000000L,
  89.     0x100000000L,
  90.     0x200000000L,
  91.     0x400000000L,
  92.     0x800000000L,
  93.     0x1000000000L,
  94.     0x2000000000L,
  95.     0x4000000000L,
  96.     0x8000000000L,
  97.     0x10000000000L,
  98.     0x20000000000L,
  99.     0x40000000000L,
  100.     0x80000000000L,
  101.     0x100000000000L,
  102.     0x200000000000L,
  103.     0x400000000000L,
  104.     0x800000000000L,
  105.     0x1000000000000L,
  106.     0x2000000000000L,
  107.     0x4000000000000L,
  108.     0x8000000000000L,
  109.     0x10000000000000L,
  110.     0x20000000000000L,
  111.     0x40000000000000L,
  112.     0x80000000000000L,
  113.     0x100000000000000L,
  114.     0x200000000000000L,
  115.     0x400000000000000L,
  116.     0x800000000000000L,
  117.     0x1000000000000000L,
  118.     0x2000000000000000L,
  119.     0x4000000000000000L,
  120.     0x8000000000000000L]
  121. KNIGHT_MOVES = [
  122.     0xFFFFFFFFFFFFFFFFL] * 64
  123. WHITE_PAWN_MOVES = KNIGHT_MOVES[:]
  124. WHITE_PAWN_TAKES = KNIGHT_MOVES[:]
  125. BLACK_PAWN_MOVES = KNIGHT_MOVES[:]
  126. BLACK_PAWN_TAKES = KNIGHT_MOVES[:]
  127. ROOK_MOVES = KNIGHT_MOVES[:]
  128. BISHOP_MOVES = KNIGHT_MOVES[:]
  129. KNIGHT_MOVES = KNIGHT_MOVES[:]
  130. QUEEN_MOVES = KNIGHT_MOVES[:]
  131. WHITE_KING_MOVES = KNIGHT_MOVES[:]
  132. BLACK_KING_MOVES = KNIGHT_MOVES[:]
  133. INBETWEEN_SQUARES = [
  134.     None] * 64
  135. for i in xrange(64):
  136.     INBETWEEN_SQUARES[i] = [
  137.         0x0L] * 64
  138.  
  139.  
  140. def genMoves():
  141.     for start in xrange(64):
  142.         (f0, r0) = getRankAndFile(start)
  143.         pawnField = 0
  144.         pawnTakeField = 0
  145.         rookField = 0
  146.         bishopField = 0
  147.         knightField = 0
  148.         queenField = 0
  149.         kingField = 0
  150.         for end in xrange(64):
  151.             if end == start:
  152.                 continue
  153.             
  154.             (f1, r1) = getRankAndFile(end)
  155.             endField = LOCATIONS[end]
  156.             ibField = 0
  157.             if f0 == f1 and r0 == r1 or abs(f0 - f1) == abs(r0 - r1):
  158.                 fstep = cmp(f1, f0)
  159.                 rstep = cmp(r1, r0)
  160.                 file = f0 + fstep
  161.                 rank = r0 + rstep
  162.                 count = max(abs(f0 - f1), abs(r0 - r1)) - 1
  163.                 for i in xrange(count):
  164.                     ibField |= LOCATIONS[(7 - rank) * 8 + file]
  165.                     file += fstep
  166.                     rank += rstep
  167.                 
  168.             
  169.             INBETWEEN_SQUARES[start][end] = ibField
  170.             if f0 == f1:
  171.                 if r1 - r0 == 1:
  172.                     pawnField |= endField
  173.                 
  174.                 if r0 == 1 and r1 == 3:
  175.                     pawnField |= endField
  176.                 
  177.             
  178.             if abs(f0 - f1) == 1 and r1 - r0 == 1:
  179.                 pawnField |= endField
  180.                 pawnTakeField |= endField
  181.             
  182.             if abs(f0 - f1) * abs(r0 - r1) == 2:
  183.                 knightField |= endField
  184.             
  185.             if abs(f0 - f1) == abs(r0 - r1):
  186.                 bishopField |= endField
  187.                 queenField |= endField
  188.             
  189.             if abs(f0 - f1) * abs(r0 - r1) == 0:
  190.                 rookField |= endField
  191.                 queenField |= endField
  192.             
  193.             if abs(f0 - f1) <= 1 and abs(r0 - r1) <= 1:
  194.                 kingField |= endField
  195.             
  196.             if r0 == r1 and r0 == 0 and f0 == 4 and abs(f0 - f1) == 2:
  197.                 kingField |= endField
  198.                 continue
  199.         
  200.         WHITE_PAWN_MOVES[start] = pawnField
  201.         WHITE_PAWN_TAKES[start] = pawnTakeField
  202.         ROOK_MOVES[start] = rookField
  203.         BISHOP_MOVES[start] = bishopField
  204.         KNIGHT_MOVES[start] = knightField
  205.         QUEEN_MOVES[start] = queenField
  206.         WHITE_KING_MOVES[start] = kingField
  207.     
  208.     reflectMoves(WHITE_PAWN_MOVES, BLACK_PAWN_MOVES)
  209.     reflectMoves(WHITE_PAWN_TAKES, BLACK_PAWN_TAKES)
  210.     reflectMoves(WHITE_KING_MOVES, BLACK_KING_MOVES)
  211.     move = 60
  212.  
  213. genMoves()
  214.